package cn.tedu.charging.order.websocket;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.ConcurrentHashMap;

@Slf4j
@Component
@ServerEndpoint("/ws/server/{userId}")
public class WebSocketServer {

    /**
     * 本地Map
     * key 用户id value 用户对应的session
     * 4大问题
     * 1 数据量
     * 2 持久化
     * 3 分布式 数据独享
     * 4 线程安全
     *
     */
    private static ConcurrentHashMap<Integer,Session>
            sessionMap = new ConcurrentHashMap();

    /**
     * 连接建立成功调用的方法
     * 类似 mqtt MqttConsumer#connectComplete
     * "/ws/server/{userId}" 从地址获取userId
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") Integer userId){
        log.debug("WebSocketServer onOpen");
        sessionMap.put(userId,session);
        log.debug("用户:{},上线,连接成功:{}",userId,session);
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(Session session, @PathParam("userId") Integer userId){
        log.debug("WebSocketServer onClose");
        sessionMap.remove(userId);
        log.debug("用户:{},下线:{}",userId,session);
    }

    /**
     * 发生错误时调用
     */
    @OnError
    public void onError(Session session, Throwable throwable){
        log.debug("WebSocketServer onError");
        log.debug("用户:{},连接异常:{}",session,throwable);
    }

    /**
     * 消息到达
     * 类似 MqttConsumer#messageArrived
     * 消息从用户到达 服务器
     * @param message
     * @param session
     */
    @OnMessage
    public void onMessage(String message, Session session){
        log.debug("WebSocketServer onMessage");
        log.debug("用户:{},发送消息:{}",session,message);
    }

    /**
     * 给用户发送消息
     * @param userId 用户
     * @param message 消息
     */
    public static void sendMessage(Integer userId,String message){
        Session session = sessionMap.get(userId);
        if(session != null){
            session.getAsyncRemote().sendText(message);
        }else {
            log.debug("用户:{},没有连接",userId);
        }
    }

}
